/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package aicue1.singletons;

import aicue1.beans.Item;
import aicue1.beans.Order;
import aicue1.soapfaults.UnknownOrderFault;
import java.util.ArrayList;
import java.util.ListIterator;

/**
 *
 * @author Thomas
 */
public class ShippedItemsSingleton
{
    /**
     * Privates Klassenattribut,
     * wird beim erstmaligen Gebrauch (nicht beim Laden) der Klasse erzeugt
     */
    private static ShippedItemsSingleton shippedInstance = null;

    private ArrayList<Item> shippedItemsList = null;

    /** Konstruktor ist privat, Klasse darf nicht von außen instanziiert werden. */
    private ShippedItemsSingleton()
    {
        shippedItemsList = new ArrayList<Item>();
    }

    /**
     * Statische Methode "getInstance()" liefert die einzige Instanz der Klasse zurück.
     * Ist synchronisiert und somit thread-sicher.
     */
    public synchronized static ShippedItemsSingleton getInstance()
    {
        if (shippedInstance == null) {
           shippedInstance = new ShippedItemsSingleton();
        }
        return shippedInstance;
    }

    public synchronized Boolean insertShippedItem(Item item)
    {
        Boolean insertOk = false;
        if(!shippedItemsList.contains(item))
        {
            shippedItemsList.add(item);
            insertOk = true;
        }
        return insertOk;
    }

    public synchronized Boolean isFinished(Order order) throws UnknownOrderFault
    {
        Boolean isFinished = true;

        OrdersSingleton ordersInstance = OrdersSingleton.getInstance();
        if(!ordersInstance.doesOrderExist(order))
            throw new UnknownOrderFault("Order doesn't exist.");

        ListIterator<Item> litr = ordersInstance.getItems(order).listIterator();
        while(litr.hasNext())
        {
            if(!shippedItemsList.contains(litr.next()))
            {
                isFinished = false;
                break;
            }
        }

        return isFinished;
    }

    public synchronized void clearList()
    {
         shippedItemsList.clear();
    }
}
